// 通用类型校验
import emojiRegex from 'emoji-regex'

/**
 * 字符串空判断
 * @param {String} str
 * @returns {Boolean}
 */
export function isEmpty(str: any): boolean {
  return str == null || str === ''
}

/**
 * 对象空判断
 * @param {Object} obj
 * @returns {Boolean}
 */
export function isEmptyObject(obj: object) {
  return Object.keys(obj).length === 0
}

/**
 * 是否为外部资源
 * @param {String} path
 * @returns {Boolean}
 */
export function isExternal(path: string) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * 判断是否存在emoji表情
 * @param {String} string
 * @returns {Boolean}
 */
export function hasEmoji(string: string) {
  const reg = emojiRegex()
  return reg.test(string)
}

/**
 * 判断是否为11位的手机号码
 * @param {String} phone 电话号码
 * @returns {Boolean}
 */
export function isPhoneNumber(phone: string) {
  return /^1[3|4|5|6|7|8|9]\d{9}$/.test(phone)
}

/**
 * 字符校验
 * 只能包含字母数字和汉字和括号
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isNoSignal(str: string) {
  // 匹配非数字，字母，汉字的字符
  const regExp = /(^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFFa-zA-Z0-9()（）]+$)/
  if (regExp.test(str)) {
    return true
  }
  return false
}

/**
 * 字符校验
 * 不包含表情等特殊符号
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isNoSpecialSignal(str: string) {
  // 匹配特殊字符
  const regExp =
    /(^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFFa-zA-Z0-9()（）^·`[\]{}【】｛｝<>《》，。,.、…？?;:；：\\“”/"‘’'!！@#$%&*\-_=￥——~+|\r\n ]*$)/
  if (regExp.test(str)) {
    return true
  }
  return false
}

/**
 * 字符校验
 * 只能包含字母和汉字
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isNoDigitAndSignal(str: string) {
  // 匹配非字母，汉字的字符
  const regExp = /(^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFFa-zA-Z]+$)/
  if (regExp.test(str)) {
    return true
  }
  return false
}

/**
 * 字符校验
 * 只能包含字母和数字
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isNoDigitAndNumber(str: string) {
  // 匹配非字母，汉字的字符
  const regExp = /(^[0-9a-zA-Z]+$)/
  if (regExp.test(str)) {
    return true
  }
  return false
}

/**
 * 字符校验
 * 不能包含汉字和表情等特殊符号
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isNoChineseAndSignal(str: string) {
  // 匹配非字母，数字和英文符号的字符
  const regExp = /(^[0-9a-zA-Z()[\]{}<>,.?;:\\/"'!@#$%&*\-_=~^+|\r\n]+$)/
  if (regExp.test(str)) {
    return true
  }
  return false
}

/**
 * 密码校验
 * 必须包含大小写字母和数字的组合，可以使用特殊字符，长度在 8-16 之间
 * @param {string} pw
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isPassword(pw: string) {
  return /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$/.test(pw)
}

/**
 * 手机号校验
 * 2021/6/28 姚 备注：
 * 三大运营商最新号段：
 * 移动号段：
 * 134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 195 198
 *
 * 联通号段：
 * 130 131 132 145 146 155 156 166 167 171 175 176 185 186 196
 *
 * 电信号段：
 * 133 149 153 173 174 177 180 181 189 191 193 199
 *
 * 虚拟运营商:
 * 162 165 167 170 171
 *
 * 总结：
 * 13开头排序：(0-9)（134 135 136 137 138 139 130 131 132 133）
 * 14开头排序：(5-9)（147 148 145 146 149）
 * 15开头排序：(0-3|5-9)（150 151 152 157 158 159 155 156 153）
 * 16开头排序：(6-7)（166 167）
 * 17开头排序：(1-8)（172 178 171 175 176 173 174 177）
 * 18开头排序：(0-9)（182 183 184 187 188 185 186 180 181 189）
 * 19开头排序：(1|3|5|6|8|9)（195 198 196 191 193 199）
 *
 * 如后续运营号段发生变化，则需要做对应的修改
 *
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isMobilePhone(str: string) {
  // console.log(str)
  return /^((13[0-9])|(14[5-9])|(15([0-3]|[5-9]))|(16[6-7])|(17[1-8])|(18[0-9])|(19[1|3])|(19[5|6])|(19[8|9]))\d{8}$/g.test(
    str,
  )
}

export function isTelPhone(str: string) {
  return /^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/g.test(str)
}

/**
 * 校验手机及座机
 * @param str
 * @returns
 */
export function isPhoneNum(str: string) {
  const reg =
    /^((0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d{7,8}|\(?0\d{2,3}[)-]*\d{7,8})|(((13[0-9])|(14[5-9])|(15([0-3]|[5-9]))|(16[6-7])|(17[1-8])|(18[0-9])|(19[1|3])|(19[5|6])|(19[8|9]))\d{8}))$/g
  return reg.test(str)
}

/**
 * 邮箱地址校验
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isEmailAddr(str: string) {
  return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(str)
}

export function isvalidUsername(str: string) {
  return str.trim().length >= 2
}

// 合法uri
export function validateURL(textval: string) {
  const urlregex =
    /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return urlregex.test(textval)
}

// 小写字母
export function validateLowerCase(str: string) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

// 大写字母
export function validateUpperCase(str: string) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

// 大小写字母
export function validatAlphabets(str: string) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * validate email
 * @param email
 * @returns {boolean}
 */
export function validateEmail(email: string) {
  const re =
    /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return re.test(email)
}

/**
 * validate obj isEmpty
 * @param obj
 * @returns {boolean}
 */
export function isEmptyObj(obj: any) {
  if (obj === '') return true // 检验空字符串
  if (obj === 'null') return true // 检验字符串类型的null
  if (obj === 'undefined') return true // 检验字符串类型的 undefined
  if (!obj && obj !== 0 && obj !== '') return true // 检验 undefined 和 null
  if (Object.prototype.isPrototypeOf.call(Array, obj) && obj.length === 0) return true // 检验空数组
  if (Object.prototype.isPrototypeOf.call(Object, obj) && Object.keys(obj).length === 0) return true // 检验空对象
  return false
}

/**
 * 匹配企业名称（汉字、数字、英文、括号、&）
 * @param {*} val
 * @returns {boolean}
 */
export function validateEnterpriseName(val: string) {
  const reg = /^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF()（）\da-zA-Z&]{2,32}$/gi
  return reg.test(val)
}

/**
 * 匹配统一社会信用代码
 * 第一部分：登记管理部门代码1位 (数字或大写英文字母)
 * 第二部分：机构类别代码1位 (数字或大写英文字母)
 * 第三部分：登记管理机关行政区划码6位 (数字)
 * 第四部分：主体标识码（组织机构代码）9位 (数字或大写英文字母)
 * 第五部分：校验码1位 (数字或大写英文字母)
 * 目前还有老的工商注册代码，也就是15位的社会信用代码
 * @param {*} val
 * @returns {boolean}
 */
export function validateUnifiedCreditCode(val: string) {
  const reg = /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/
  return reg.test(val)
}

/**
 * 匹配姓名
 * @param {*} val
 * @returns {boolean}
 */
export function validateHumanName(val: string) {
  // 英文名
  const enReg = /^[A-Z][a-z]*(\s[A-Z][a-z]*)*$/
  // 中文名
  // 常用
  const cnCommonReg = /^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF]+$/
  // 新疆
  const cnXinJiangReg =
    /^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF]+·[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF]+$/
  return enReg.test(val) || cnCommonReg.test(val) || cnXinJiangReg.test(val)
}

/**
 * 匹配联系方式
 * 包括手机及座机
 * @param {*} val
 * @returns {boolean}
 */
export function validateContactInformation(val: string) {
  const reg = /^(?:(0\d{2,3}-)?\d{7,8}|1[3-9]\d{9})$/
  return reg.test(val)
}

/**
 * 匹配空格
 * @param {*} val
 * @returns {boolean}
 */
export function hasSpace(val: string) {
  const reg = / /g
  return reg.test(val)
}

/**
 * 匹配标签字段
 * @param {*} val
 * @returns {boolean}
 */
export function validateTag(val: string) {
  const reg = /^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFFa-zA-Z0-9]{1,10}$/
  return reg.test(val)
}

/**
 * 匹配中英文
 * @param {*} val
 * @returns {boolean}
 */
export function validateChineseAndEnglish(val: string) {
  const reg = /^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFFa-zA-Z]*$/
  return reg.test(val)
}

export function validateChinese(val: string) {
  const reg = /^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF]*$/
  return reg.test(val)
}

/**
 * 匹配正整数
 * @param {*} val
 * @returns {boolean}
 */
export function validatePlusInt(val: string) {
  const reg = /^[1-9]+[0-9]*$/g
  return reg.test(val)
}

/**
 * 匹配非负整数
 * @param {*} val
 * @returns {boolean}
 */
export function validatePlusInt0(val: string) {
  const reg = /(^[1-9]+[0-9]*$)|(^[0]{1}$)/
  // const reg = /^[0-9]+$/g
  return reg.test(val)
}

/**
 * 匹配非负小数
 * @param {*} val
 * @returns {boolean}
 */
export function validatePlusFloat(val: string) {
  const reg = /^(0|[1-9]\d*)(.[0-9]+)?$/g
  return reg.test(val)
}

/**
 * 匹配正小数（保留一位）
 * @param {*} val
 * @returns {boolean}
 */
export function validatePlusFloatWithOne(val: string) {
  const reg = /^(0|[1-9]\d*)(.[0-9]{1})?$/g
  return reg.test(val)
}

/**
 * 匹配正小数（保留两位）
 * @param {*} val
 * @returns {boolean}
 */
export function validatePlusFloatWithTwo(val: string) {
  const reg = /^(0|[1-9]\d*)(.[0-9]{1,2})?$/g
  return reg.test(val)
}

/**
 * 匹配正小数（保留三位）
 * @param {*} val
 * @returns {boolean}
 */
export function validatePlusFloatWithThree(val: string) {
  const reg = /^(0|[1-9]\d*)(.[0-9]{1,3})?$/g
  return reg.test(val)
}

/**
 * 匹配小数（保留两位）
 * @param {*} val
 * @returns {boolean}
 */
export function validateFloatWithTwo(val: string) {
  const reg = /^([-+])?(0|[1-9]\d*)(.[0-9]{1,2})?$/g
  return reg.test(val)
}

/**
 * 匹配身份证号
 * @param {String} val
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function validateIDCard(val: string) {
  const reg =
    /^[1-9]\d{5}(18|19|20|21|22)\d{2}((0[1-9])|10|11|12)(0[1-9]|[12]\d|3[01])\d{3}([0-9]|X)$|^[1-9]\d{5}\d{2}((0[1-9])|10|11|12)(0[1-9]|[12]\d|3[01])\d{3}$/
  return reg.test(val)
}

/**
 * 匹配数字或者/或.或-
 * @param {String} val
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function validateNumOrSpecial(val: string) {
  const reg = /^[\d\-/.]+$/
  return reg.test(val)
}

/**
 * 字符校验
 * 包含数字字母中文-/.特殊符号
 * @param {string} str
 * @returns {Boolean} 校验通过返回true，失败返回false
 */
export function isNoSomeSpecialSignal(str: string) {
  // 匹配特殊字符
  const regExp = /(^[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFFa-zA-Z0-9()\-/. ]*$)/
  if (regExp.test(str)) {
    return true
  }
  return false
}
